#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <vector>
using namespace std;
#define Max_SigNum 31
static vector<int> vec={2}; 

static void show_pending(const sigset_t &pending)
{
    for(int signo = Max_SigNum;signo>=1;signo--)
    {
        if(sigismember(&pending,signo)) cout<<"1";
        else cout<<"0";
    }
    cout<<"\n";
}

static void handler_func(int signo)
{

    cout<<signo<<"号信号已经被递达"<<endl;
}


int main()
{
    //自定义一个2号信号，让他在crtl+c的情况下不退出
    for(const auto &sig:vec)  signal(sig,handler_func);
    //1、先声明对应sigset参数
    sigset_t block,oblock,pending;

    //1.1初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    //1.2 添加要屏蔽的信号
    for(const auto &sig:vec)  sigaddset(&block, sig);
    //1.3开始屏蔽,设置进内核
    sigprocmask(SIG_SETMASK,&block,&oblock);

    int cnt =10;
    while(true)
    {
        //2.1 初始化
        sigisemptyset(&pending);
        //2.2 获取pending参数
        sigpending(&pending);
        //2.3 打印
        show_pending(pending);
        //3
        sleep(1);
        if(cnt--==0)
        {
            sigprocmask(SIG_SETMASK,&oblock,&block);//一旦对特定信号进行接触屏蔽，一般OS至少要立马递达一个信号
            //这里直接递达了2号信号，中止进程，直接从内核态结束了进程，不会返回用户态，所以不会执行以下的语句
            cout<<"解除屏蔽"<<endl;
            cnt=10;

        }
    }
    return 0;
}